package com.hx.dynamic.demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author： Huathy
 * @ClassPath： com.hx.dynamic.demo1.ProxyInvocationHandler
 * @Date： 2021-02-04 11:41
 * @Description： 自动生成代理类
 */

/**
 * InvocationHandler是由代理实例的调用处理程序实现的接口 。
 * 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时，方法调用将被编码并分派到其调用处理程序的invoke方法。
 */
public class ProxyInvocationHandler implements InvocationHandler {

    private Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                rent.getClass().getInterfaces(),
                this);
    }

    /**
     * 处理代理实例，并返回结果
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        /**
         * 动态代理的本质，就是使用反射机制实现。
         */
        seeHouse();
        Object res = method.invoke(rent, args);
        collect();
        return res;
    }

    public void seeHouse() {
        System.out.println("中介带看房");
    }

    public void collect() {
        System.out.println("收取中介费");
    }
}
